import numpy as np
import matplotlib.pyplot as plt

def regressao_linear(x,y):

    n = len(x)

    #somas
    sumX = sum(x)
    sumY = sum(y)

    sumX2 = sum(x**2)
    sumY2 = sum(y**2)
    sumXY = sum(x * y)

    #m , b, r2
    m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX**2)
    b = (sumX2 * sumY - sumX * sumXY) / (n * sumX2 - sumX**2)
    r2 = (n * sumXY - sumX * sumY)**2 / ((n * sumX2 - sumX**2) * (n * sumY2 - sumY**2))

    #incertezas
    dM = abs(m) * np.sqrt(((1 / r2) - 1) / (n - 2))
    dB = dM * np.sqrt(sumX2 / n)

    return m, b, r2, dM, dB


def grafico(x,y):
    plt.plot(x, y, 'ro')
    plt.xlabel('tempo (dias)')
    plt.ylabel('atividade (mCi)')
    plt.title('Regressão Linear (Lei exponencial)')
    plt.grid()
    plt.show()



def main():
    T = np.linspace(0,50,10)    #np.arange(0, 50, 5)
    A = np.array([9.676, 6.355, 4.261, 2.729, 1.862, 1.184, 0.7680, 0.4883, 0.3461, 0.2119])


    #b) gráfico do logaritmo da atividade com o tempo 
    #ln(A)=ln(A0)−λt 

    logA = np.log(A)            ####logA0 = np.log(A[0]) ?

    grafico(T,logA) #a atividade decai exponencialmente com o tempo


    #c) Encontre a função que relaciona a atividade com o tempo
    m, b, r2, dM, dB = regressao_linear(T, logA)

    A0 = np.exp(b)
    lmbda = m

    print(f"Função ajustada: A(t) = {A0:.4f} * e^({lmbda:.4f} * t)")
    print(f"Coeficiente de determinação r² = {r2:.5f}")

    #d) gráfico da função ajustada
    A_fit = A0 * np.exp(lmbda * T)
    grafico(T, A_fit)


if __name__ == "__main__":
    main()

